import numpy as np


# 1. 加载数据
def load_data(file_path):
    """加载Iris数据集"""
    data = []
    labels = []

    with open(file_path, 'r') as file:
        for line in file.readlines():
            parts = line.strip().split(',')
            if len(parts) == 5:  # 确保每行有5个元素（4个特征 + 1个标签）
                data.append([float(x) for x in parts[:-1]])  # 提取前四列特征
                labels.append(parts[-1])  # 提取标签

    return np.array(data), labels


# 2. 欧氏距离计算
def euclidean_distance(point1, point2):
    """计算两点之间的欧氏距离"""
    return np.sqrt(np.sum((point1 - point2) ** 2))


# 3. K-means算法
def kmeans(data, k, max_iters=100):
    """实现K-means聚类算法"""
    # 随机初始化K个中心点
    np.random.seed(42)  # 设置随机种子，保证结果可复现
    centroids = data[np.random.choice(data.shape[0], k, replace=False)]

    for i in range(max_iters):
        # 步骤2：分配每个样本到最近的中心点
        labels = np.array([np.argmin([euclidean_distance(x, c) for c in centroids]) for x in data])

        # 步骤3：更新每个簇的中心点
        new_centroids = np.array([data[labels == j].mean(axis=0) for j in range(k)])

        # 如果中心点没有变化，停止迭代
        if np.all(centroids == new_centroids):
            break

        centroids = new_centroids

    return centroids, labels


# 4. 主函数
if __name__ == "__main__":
    # 加载Iris数据集
    file_path = "C:\\Users\\li\\Desktop\\机器学习\\iris\\iris.data"
    data, labels = load_data(file_path)
    print("数据预览（前5个样本）：")
    print(data[:5])  # 查看前5个样本

    # 执行K-means算法
    k = 3  # 选择K=3，因为Iris数据集有3个类别
    centroids, labels = kmeans(data, k)

    # 输出聚类中心和每个样本的标签
    print("聚类中心：")
    print(centroids)
    print("每个样本的标签：")
    print(labels)
